artaios
Goto Top

PowerShell CSV-Import Set-ADuser Nullwerte ausschließen

Hallo zusammen,

als PowerShell Novize bräuchte ich bitte Eure Unterstützung. Ich habe eine relativ mickrige AD-Umgebung aufs Auge gedrückt bekommen. Die User wurden kreuz und quer angelegt, meistens nur mit den nötigsten Angaben. Da nun eine AD-Synchronisierung ins Haus steht (MS-AD-Sync) und bisher sämtliche User Details im Office Portal gepflegt wurden, muss ich die lokalen User dementsprechend anpassen, da sonst sämtliche User Details, welche online gepflegt sind, durch die Synchronisierung wegfallen würden. Soweit also erst mal die Hintergründe.

Um jetzt nicht alles manuell eingeben zu müssen, habe ich mir eine Userliste vom Office Portal exportiert, gleichzeitig habe ich die User, Standortbezogen, aus dem AD exportiert. Die Überschriften aus der Portal-CSV habe ich denen der AD-CSV angeglichen. Das ist also meine Ausgangslage, Ziel ist es jetzt, die Portal-CSV zu importieren, nach Standorten (Städten) zu filtern und die entsprechenden User Details zu füllen. Die Filter sind deshalb nötig, da wir die Synchronisierung Standortweise durchführen wollen/müssen.
So sieht die CSV auszugsweise aus:
ad-csv
dazu habe ich nun folgendes Skript zusammengeklaut:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach($user in $user){
# Filtere User und hole Atribute
    $ADUser = Get-ADUser -filter {SamAccountName -eq '$($_.SamAccountName)' -and (City -like 'München')} -Properties c,City,CN,Company,Country,Department,Description,DisplayName,Division,EmailAddress,Fax,GivenName,HomePage,HomePhone,Initials,`  
			Manager,MobilePhone,Name,Office,OfficePhone,Organization,OtherName,POBox,PostalCode,SamAccountName,sn,st,State,StreetAddress,Surname,Title,UserPrincipalName
#übergebe gefilterte und gefundene User und führe Änderungen aus
	if ($ADUser){
		if ($_.c) {$ADUser.c = $_.c}
		if ($_.City) {$ADUser.City = $_.City}
		if ($_.CN) {$ADUser.CN = $_.CN}
		if ($_.Company) {$ADUser.Company = $_.Company}
		if ($_.Country) {$ADUser.Country = $_.Country}
		if ($_.Department) {$ADUser.Department = $_.Department}
		if ($_.Description) {$ADUser.Description = $_.Description}
		if ($_.DisplayName) {$ADUser.DisplayName = $_.DisplayName}
		if ($_.Division) {$ADUser.Division = $_.Division}
		if ($_.EmailAddress) {$ADUser.EmailAddress = $_.EmailAddress}
		if ($_.Fax) {$ADUser.Fax = $_.Fax}
		if ($_.GivenName) {$ADUser.GivenName = $_.GivenName}
		if ($_.HomePage) {$ADUser.HomePage = $_.HomePage}
		if ($_.HomePhone) {$ADUser.HomePhone = $_.HomePhone}
		if ($_.Initials) {$ADUser.Initials = $_.Initials}
		if ($_.Manager) {$ADUser.Manager = $_.Manager}
		if ($_.MobilePhone) {$ADUser.MobilePhone = $_.MobilePhone}
		if ($_.Name) {$ADUser.Name = $_.Name}
		if ($_.Office) {$ADUser.Office = $_.Office}
		if ($_.OfficePhone) {$ADUser.OfficePhone = $_.OfficePhone}
		if ($_.Organization) {$ADUser.Organization = $_.Organization}
		if ($_.OtherName) {$ADUser.OtherName = $_.OtherName}
		if ($_.POBox) {$ADUser.POBox = $_.POBox}
		if ($_.PostalCode) {$ADUser.PostalCode = $_.PostalCode}
		if ($_.SamAccountName) {$ADUser.SamAccountName = $_.SamAccountName}
		if ($_.sn) {$ADUser.sn = $_.sn}
		if ($_.st) {$ADUser.st = $_.st}
		if ($_.State) {$ADUser.State = $_.State}
		if ($_.StreetAddress) {$ADUser.StreetAddress = $_.StreetAddress}
		if ($_.Surname) {$ADUser.Surname = $_.Surname}
		if ($_.Title) {$ADUser.Title = $_.Title}
		if ($_.UserPrincipalName) {$ADUser.UserPrincipalName = $_.UserPrincipalName}
        Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
	}else{
        Write-Warning ("Fehler beim update von " + $($user.name))  
		}
		}
Sieht zwar gut aus, funktioniert aber nicht, face-sad läuft in der ISE durch, gibt jedoch im Anschluss zeilenweise die "Warnungsmeldung" der Else-Schleife aus, aber führt keinerlei Änderungen im AD selbst aus.
ad-ps-fehler
In der Test-csv welche dazu verwendet wurde, sind lediglich drei Namen aufgeführt, respektive dementsprechend gefüllt. Wollte das noch nicht mit der großen Liste testen, sondern erst mal klein. Hatte erst den Verdacht, dass bei dem Skript zu viele if-Schleifen sind und deshalb die else-Schleife so oft kommt, aber auch das Kürzen des Skriptes hat diesbezüglich nichts gebracht.

Wäre super, wenn mir da jemand weiterhelfen könnte.
Gruß
Artaios

Content-Key: 6982331684

Url: https://administrator.de/contentid/6982331684

Printed on: May 20, 2024 at 18:05 o'clock

Mitglied: 3063370895
3063370895 May 02, 2023 updated at 09:45:23 (UTC)
Goto Top
Hi,

hier ist schonmal was komisch:

foreach($user in $user){
# Filtere User und hole Atribute
    $ADUser = Get-ADUser -filter {SamAccountName -eq '$($_.SamAccountName)'  

Sollte wohl heißen

foreach($u in $user){
# Filtere User und hole Atribute
    $ADUser = Get-ADUser -filter {SamAccountName -eq '$($u.SamAccountName)'  

bzw. besser:
$ADUser = Get-ADUser -identity $u.samaccountname 
Und dann entsprechend:

if ($u.c) {$ADUser.c = $u.c}
if ($u.City) {$ADUser.City = $u.City}
if ($u.CN) {$ADUser.CN = $u.CN}
...

Insgesamt dann also:

#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
    # Filtere User und hole Atribute
    $ADUser = Get-ADUser -Identity $u.SamAccountName -Properties c, City, CN, Company, Country, Department, Description, DisplayName, Division, EmailAddress, Fax, GivenName, HomePage, HomePhone, Initials, `
        Manager, MobilePhone, Name, Office, OfficePhone, Organization, OtherName, POBox, PostalCode, SamAccountName, sn, st, State, StreetAddress, Surname, Title, UserPrincipalName
    #übergebe gefilterte und gefundene User und führe Änderungen aus
    if ($ADUser) {
        if ($u.c) { $ADUser.c = $u.c }
        if ($u.City) { $ADUser.City = $u.City }
        if ($u.CN) { $ADUser.CN = $u.CN }
        if ($u.Company) { $ADUser.Company = $u.Company }
        if ($u.Country) { $ADUser.Country = $u.Country }
        if ($u.Department) { $ADUser.Department = $u.Department }
        if ($u.Description) { $ADUser.Description = $u.Description }
        if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
        if ($u.Division) { $ADUser.Division = $u.Division }
        if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
        if ($u.Fax) { $ADUser.Fax = $u.Fax }
        if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
        if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
        if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
        if ($u.Initials) { $ADUser.Initials = $u.Initials }
        if ($u.Manager) { $ADUser.Manager = $u.Manager }
        if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
        if ($u.Name) { $ADUser.Name = $u.Name }
        if ($u.Office) { $ADUser.Office = $u.Office }
        if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
        if ($u.Organization) { $ADUser.Organization = $u.Organization }
        if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
        if ($u.POBox) { $ADUser.POBox = $u.POBox }
        if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
        if ($u.SamAccountName) { $ADUser.SamAccountName = $u.SamAccountName }
        if ($u.sn) { $ADUser.sn = $u.sn }
        if ($u.st) { $ADUser.st = $u.st }
        if ($u.State) { $ADUser.State = $u.State }
        if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
        if ($u.Surname) { $ADUser.Surname = $u.Surname }
        if ($u.Title) { $ADUser.Title = $u.Title }
        if ($u.UserPrincipalName) { $ADUser.UserPrincipalName = $u.UserPrincipalName }
        Set-ADUser -Instance $ADUser
        #Schreibe Fehlermeldung welcher User nicht geändert wurde
    }
    else {
        Write-Warning ("Fehler beim update von " + $($u.name))  
    }
}
-Thomas
Mitglied: 3063370895
3063370895 May 02, 2023 updated at 09:59:24 (UTC)
Goto Top
Moment mal, hat die CSV kein samAccountName?

Entspricht die Mailadresse in der CSV dem UPN im AD? Dann ersetze Zeile 6 und 7 durch:
$ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.EmailAddress} -Properties *

Alternativ dem property "mail" im AD? Dann ersetze Zeile 6 und 7 durch:
$ADUser = Get-ADUser -Filter {mail -eq $u.EmailAddress} -Properties *

-Properties * gibt alle Attribute aus. Bei der Menge die du benötigst kann man sich das Filtern IMO sparen.

Nach Standort zu filtern ist mMn. auch nicht nötig, da die Zuordnung pro Emailadresse eindeutig ist. Wenn die entsprechende Mailadresse lokal im AD nicht vorhanden ist, wird auch nichts ausgegeben/geändert.

-Thomas
Member: Artaios
Artaios May 02, 2023 at 10:23:04 (UTC)
Goto Top
Danke erst mal für die schnelle Hilfestellung, leider klappt es noch nicht ganz face-sad
die CSV hat einen samAccountName
Mailadresse entspricht dem UPN
Ich habe deinen Code rauskopiert und durchlaufen lassen, dabei bekam ich folgende Fehlermeldung:
Get-ADUser : Das Argument für den Parameter "Identity" kann nicht überprüft werden. Die Identitätseigenschaft des Arguments ist NULL oder leer.  
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:6 Zeichen:36
+     $ADUser = Get-ADUser -identity $u.SamAccountName -filter {(City - ...
+                                    ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser
 
Set-ADUser : Das benutzerdefinierte Attribut "c" und das erweiterte Attribut "Country" können nicht zusammen angegeben werden. Sie gelten für das gleiche Verzeichnisattribut.  
Habe daraufhin die Spalte "C" aus der csv gelöscht und auch im Skript bei den if-Bedingungen und bei den Properties, jedoch bleibt der Fehler. Ist mir etwas unverständlich, wenn das überall gelöscht ist, weshalb wird es dennoch abgefragt? Oder hätte ich da Country überall löschen sollen?
Gruß
Artaios
Mitglied: 3063370895
3063370895 May 02, 2023 at 10:36:53 (UTC)
Goto Top
Kannst du die CSV mit einem oder zwei Testeinträgen hier posten?

-Thomas
Member: Artaios
Artaios May 02, 2023 updated at 11:00:33 (UTC)
Goto Top
Hallo Thomas,
ich habe deine vorgeschlagenen Änderungen probiert, allerdings haben beide ihre Tücken, da die Mailadresse nicht überall gepflegt ist, aber ich habe dann den UPN versucht, der ist überall vorhanden. Hat leider auch nicht funktioniert.
$ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.UserPrincipalName} -Properties *
Führte zu der Fehlermeldung:
Get-ADUser : Eigenschaft "UserPrincipalName" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht   
gefunden.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:6 Zeichen:15
+ ...   $ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.UserPrincipa ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.G 
   etADUser
csv kann ich nicht direkt hochladen (oder ich bin mal wieder zu blond dafür), aber ich kann sie als code hier posten.
Realdaten wieder gelöscht ;)
Nicht ganz so elegant, aber zur Not sollte es reichen.
Gruß
Artaios
Member: Artaios
Artaios May 02, 2023 at 10:49:19 (UTC)
Goto Top
Hat sich überschnitten mit der Bearbeitung, hier das komplette Skript:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach($user in $user){
# Filtere User und hole Atribute
    $ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.UserPrincipalName} -Properties *
#übergebe gefilterte und gefundene User und führe Änderungen aus
	if ($ADUser){
		if ($u.City) {$ADUser.City = $u.City}
		if ($u.CN) {$ADUser.CN = $u.CN}
		if ($u.Company) {$ADUser.Company = $u.Company}
		if ($u.Country) {$ADUser.Country = $u.Country}
		if ($u.Department) {$ADUser.Department = $u.Department}
		if ($u.Description) {$ADUser.Description = $u.Description}
		if ($u.DisplayName) {$ADUser.DisplayName = $u.DisplayName}
		if ($u.Division) {$ADUser.Division = $u.Division}
		if ($u.EmailAddress) {$ADUser.EmailAddress = $u.EmailAddress}
		if ($u.Fax) {$ADUser.Fax = $u.Fax}
		if ($u.GivenName) {$ADUser.GivenName = $u.GivenName}
		if ($u.HomePage) {$ADUser.HomePage = $u.HomePage}
		if ($u.HomePhone) {$ADUser.HomePhone = $u.HomePhone}
		if ($u.Initials) {$ADUser.Initials = $u.Initials}
		if ($u.Manager) {$ADUser.Manager = $u.Manager}
		if ($u.MobilePhone) {$ADUser.MobilePhone = $u.MobilePhone}
		if ($u.Name) {$ADUser.Name = $u.Name}
		if ($u.Office) {$ADUser.Office = $u.Office}
		if ($u.OfficePhone) {$ADUser.OfficePhone = $u.OfficePhone}
		if ($u.Organization) {$ADUser.Organization = $u.Organization}
		if ($u.OtherName) {$ADUser.OtherName = $u.OtherName}
		if ($u.POBox) {$ADUser.POBox = $u.POBox}
		if ($u.PostalCode) {$ADUser.PostalCode = $u.PostalCode}
		if ($u.SamAccountName) {$ADUser.SamAccountName = $u.SamAccountName}
		if ($u.sn) {$ADUser.sn = $u.sn}
		if ($u.st) {$ADUser.st = $u.st}
		if ($u.State) {$ADUser.State = $u.State}
		if ($u.StreetAddress) {$ADUser.StreetAddress = $u.StreetAddress}
		if ($u.Surname) {$ADUser.Surname = $u.Surname}
		if ($u.Title) {$ADUser.Title = $u.Title}
		if ($u.UserPrincipalName) {$ADUser.UserPrincipalName = $u.UserPrincipalName}
        Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
	}else{
        Write-Warning ("Fehler beim update von " + $($user.name))  
		}
		}
Mitglied: 3063370895
3063370895 May 02, 2023 at 10:51:54 (UTC)
Goto Top
foreach($user in $user)
muss
foreach($u in $user)
heißen

und falls die Daten echt sind, lösch die bitte wieder face-smile

-Thomas
Member: Artaios
Artaios May 02, 2023 at 11:01:58 (UTC)
Goto Top
Die foreach Schleife habe ich angepasst. bekomme jetzt folgende Fehlermeldungen:
Get-ADUser : Eigenschaft "UserPrincipalName" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht   
gefunden.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:6 Zeichen:15
+ ...   $ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.UserPrincipa ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.G 
   etADUser
 
Ausnahme beim Festlegen von "CN": "Der Adapter kann den Wert der CN-Eigenschaft nicht festlegen."  
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:10 Zeichen:15
+         if ($u.CN) {$ADUser.CN = $u.CN}
+                     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValue
 
Ausnahme beim Festlegen von "Name": "Der Adapter kann den Wert der Name-Eigenschaft nicht festlegen."  
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:25 Zeichen:17
+         if ($u.Name) {$ADUser.Name = $u.Name}
+                       ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValue
 
Ausnahme beim Festlegen von "SamAccountName": "Der Adapter kann den Wert der SamAccountName-Eigenschaft nicht festlegen."  
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:32 Zeichen:27
+ ...   if ($u.SamAccountName) {$ADUser.SamAccountName = $u.SamAccountName}
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValue
 
Set-ADUser : Das benutzerdefinierte Attribut "c" und das erweiterte Attribut "Country" können nicht zusammen angegeben   
werden. Sie gelten für das gleiche Verzeichnisattribut.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:40 Zeichen:9
+         Set-ADUser -Instance $ADUser
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.S 
   etADUser
face-sad
Mitglied: 3063370895
3063370895 May 02, 2023 updated at 11:11:41 (UTC)
Goto Top
Das sind alles Felder, die du normalerweise auch nicht verändern willst

CN
Name
SamAccountName
UserPrincipalName

Versuche es mal so:

#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
    # Filtere User und hole Atribute
    $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *
    #übergebe gefilterte und gefundene User und führe Änderungen aus
    if ($ADUser) {
        if ($u.City) { $ADUser.City = $u.City }
        if ($u.Company) { $ADUser.Company = $u.Company }
        if ($u.Country) { $ADUser.Country = $u.Country }
        if ($u.Department) { $ADUser.Department = $u.Department }
        if ($u.Description) { $ADUser.Description = $u.Description }
        if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
        if ($u.Division) { $ADUser.Division = $u.Division }
        if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
        if ($u.Fax) { $ADUser.Fax = $u.Fax }
        if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
        if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
        if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
        if ($u.Initials) { $ADUser.Initials = $u.Initials }
        if ($u.Manager) { $ADUser.Manager = $u.Manager }
        if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
        if ($u.Office) { $ADUser.Office = $u.Office }
        if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
        if ($u.Organization) { $ADUser.Organization = $u.Organization }
        if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
        if ($u.POBox) { $ADUser.POBox = $u.POBox }
        if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
        if ($u.State) { $ADUser.State = $u.State }
        if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
        if ($u.Surname) { $ADUser.Surname = $u.Surname }
        if ($u.Title) { $ADUser.Title = $u.Title }
        Set-ADUser -Instance $ADUser
        #Schreibe Fehlermeldung welcher User nicht geändert wurde
    }
    else {
        Write-Warning ("Fehler beim update von " + $($u.name))  
    }
}

-Thomas
Member: Artaios
Artaios May 02, 2023 at 11:15:25 (UTC)
Goto Top
Danke fürs Umschreiben, ich habe deinen Code jetzt kopiert und getestet, allerdings bekomme ich immer noch nachfolgende Fehler:
Get-ADUser : Eigenschaft "UserPrincipalName" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht   
gefunden.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:6 Zeichen:15
+ ...   $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincip ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.G 
   etADUser
 
Set-ADUser : Das benutzerdefinierte Attribut "c" und das erweiterte Attribut "Country" können nicht zusammen angegeben   
werden. Sie gelten für das gleiche Verzeichnisattribut.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:36 Zeichen:9
+         Set-ADUser -Instance $ADUser
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.S 
   etADUser
Bei der CSV habe ich die Spalte "c" herausgenommen, hat jedoch leider nichts daran geändert, die Fehlermeldung bleibt leider face-sad
Mitglied: 3063370895
3063370895 May 02, 2023 at 11:17:38 (UTC)
Goto Top
 # Filtere User und hole Atribute
    $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *

ändere das bitte mal zu

 # Filtere User und hole Atribute
    $ADUser = $null
    $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *

öffne bitte auch eine neue PS-Session (also ISE oder worüber du das Skript startest neu starten)

-Thomas
Member: Artaios
Artaios May 02, 2023 updated at 11:44:07 (UTC)
Goto Top
Die beiden Zeilen ersetzt, bzw. eingefügt. Neue Adminsitzung der ISE gestartet.
Fehlermeldung:
Get-ADUser : Eigenschaft "UserPrincipalName" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht   
gefunden.
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:7 Zeichen:15
+ ...   $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincip ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.G 
   etADUser
 
WARNUNG: Fehler beim update von Axxxx
Die Fehler werden merklich weniger ;)
Gruß
Artaios

PS: CSV habe ich kontrolliert, "UserPrincipalName" ist vorhanden und heißt auch so face-sad
Mitglied: 3063370895
Solution 3063370895 May 02, 2023 updated at 12:34:18 (UTC)
Goto Top
Mein letzter Versuch

#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
    # Filtere User und hole Atribute
    $upn = $u.UserPrincipalName
    $ADUser = $null
    $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $upn } -Properties *
    #übergebe gefilterte und gefundene User und führe Änderungen aus
    if ($ADUser) {
        if ($u.City) { $ADUser.City = $u.City }
        if ($u.Company) { $ADUser.Company = $u.Company }
        if ($u.Country) { $ADUser.Country = $u.Country }
        if ($u.Department) { $ADUser.Department = $u.Department }
        if ($u.Description) { $ADUser.Description = $u.Description }
        if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
        if ($u.Division) { $ADUser.Division = $u.Division }
        if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
        if ($u.Fax) { $ADUser.Fax = $u.Fax }
        if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
        if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
        if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
        if ($u.Initials) { $ADUser.Initials = $u.Initials }
        if ($u.Manager) { $ADUser.Manager = $u.Manager }
        if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
        if ($u.Office) { $ADUser.Office = $u.Office }
        if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
        if ($u.Organization) { $ADUser.Organization = $u.Organization }
        if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
        if ($u.POBox) { $ADUser.POBox = $u.POBox }
        if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
        if ($u.State) { $ADUser.State = $u.State }
        if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
        if ($u.Surname) { $ADUser.Surname = $u.Surname }
        if ($u.Title) { $ADUser.Title = $u.Title }
        Set-ADUser -Instance $ADUser
        #Schreibe Fehlermeldung welcher User nicht geändert wurde
    }
    else {
        Write-Warning ("Fehler beim update von " + $($u.name))  
    }
}

-Thomas
Member: Artaios
Artaios May 02, 2023 at 12:42:07 (UTC)
Goto Top
Hallo Thomas,
der obere Teil scheint zu passen, allerdings will er die letzte Zeile nicht akzeptieren:
Set-ADUser : Der Namensverweis ist unzulässig
In C:\test\CSV-User update Properties Null abfrage-v2.ps1:36 Zeichen:9
+         Set-ADUser -Instance $ADUser
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Set-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8373,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Wenn ich das alles bisher richtig verstanden habe, hängt er sich nun an der Instannce auf face-sad
Mitglied: 3063370895
Solution 3063370895 May 02, 2023 updated at 12:51:26 (UTC)
Goto Top
Verstehe ich nicht, da weiter oben ja geprüft wird, ob $ADUser nicht null ist.
Versuchs mal so:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv  
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
    # Filtere User und hole Atribute
    $upn = $u.UserPrincipalName
    $ADUser = $null
    $ADUser = Get-ADUser -Filter { UserPrincipalName -eq $upn } -Properties *
    #übergebe gefilterte und gefundene User und führe Änderungen aus
    if ($ADUser) {
        if ($u.City) { $ADUser.City = $u.City }
        if ($u.Company) { $ADUser.Company = $u.Company }
        if ($u.Country) { $ADUser.Country = $u.Country }
        if ($u.Department) { $ADUser.Department = $u.Department }
        if ($u.Description) { $ADUser.Description = $u.Description }
        if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
        if ($u.Division) { $ADUser.Division = $u.Division }
        if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
        if ($u.Fax) { $ADUser.Fax = $u.Fax }
        if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
        if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
        if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
        if ($u.Initials) { $ADUser.Initials = $u.Initials }
        if ($u.Manager) { $ADUser.Manager = $u.Manager }
        if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
        if ($u.Office) { $ADUser.Office = $u.Office }
        if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
        if ($u.Organization) { $ADUser.Organization = $u.Organization }
        if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
        if ($u.POBox) { $ADUser.POBox = $u.POBox }
        if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
        if ($u.State) { $ADUser.State = $u.State }
        if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
        if ($u.Surname) { $ADUser.Surname = $u.Surname }
        if ($u.Title) { $ADUser.Title = $u.Title }
        if($ADUser){
            Set-ADUser -Instance $ADUser
        } else{
            Write-Warning "wtf $($u.name)"  
        }
        #Schreibe Fehlermeldung welcher User nicht geändert wurde
    }
    else {
        Write-Warning ("Fehler beim update von " + $($u.name))  
    }
}

Ansonsten muss einer der klügeren Köpfe hier mal reinschauen.

-Thomas
Member: Artaios
Artaios May 02, 2023 at 12:59:33 (UTC)
Goto Top
Hallo Thomas,
vielen Dank für Deine Mühen, leider bleibt es bei der Fehlermeldung face-sad
Set-ADUser : Der Namensverweis ist unzulässig
In C:\test\CSV-User update Properties Null abfrage-v3.ps1:37 Zeichen:13
+             Set-ADUser -Instance $ADUser
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Set-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8373,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Sowohl ISE als auch die "normale" PowerShell neu als Admin gestartet, trotzdem bleibt es dabei, dass der Namensverweis bemängelt wird.
Gruß
Artaios
Mitglied: 6247018886
Solution 6247018886 May 02, 2023 updated at 14:56:19 (UTC)
Goto Top
Set-ADUser : Der Namensverweis ist unzulässig
Meine Glaskugel sagt das Manager-Attribut ist schuld!
Dort muss ein DistinguishedName hinterlegt sein (also bspw. CN=Max Muster,DC=domain,DC=de)

Die ganzen IF-Abfragen würde ich persönlich auch durch eine kurze ForEach Schleife ersetzen wenn die Spaltennamen der CSV eh alle gleich sind wie die AttributNamen, ....
# ...
$properties = 'City','Company','Country','Department','Description','DisplayName','Division','EmailAddress','Fax','GivenName','HomePage','HomePhone','Initials','MobilePhone','Office','OfficePhone','Organization','OtherName','POBox','PostalCode','State','StreetAddress','Surname','Title','Manager'  
foreach($property in $properties){
    if ($u.$property){
        $ADUser.$property = $u.$property
    }
}
# ....

Cheers briggs
Member: Artaios
Artaios May 03, 2023 at 06:19:52 (UTC)
Goto Top
Hallo briggs,
ein Hoch auf deine Glaskugel!
Es war tatsächlich der Manager, sobald dieser herausgenommen wurde, lief das Skript einwandfrei durch und hat auch alle Änderungen entsprechend durchgeführt.
Ich danke euch tausende Male für die Hilfestellung! Da es durch mehrere Posts zur Lösung führte, setzte ich den gesamten Thread als gelöst.
Dankende Grüße
Artaios